package pe.edu.upla.lamerced.DAO.impl;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import pe.edu.upla.lamerced.DAO.HabitacionDAO;
import pe.edu.upla.lamerced.bean.Habitacion;
import pe.edu.upla.lamerced.bean.Tipohabitacion;


public class HabitacionDAOImpl extends HibernateDaoSupport implements HabitacionDAO {

	public HabitacionDAOImpl(){}
	
	
	public HabitacionDAOImpl(SessionFactory sessionFactory){
		setHibernateTemplate( new HibernateTemplate(sessionFactory));
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Habitacion> listaHabitaciones() {
		return this.getHibernateTemplate().find("from Habitacion h ");
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Habitacion> listaHabitaciones(Habitacion habitacion) {
		  Criteria crit = getSession().createCriteria(Habitacion.class);
		  if(habitacion.getEstado()==null){
			  crit.add(Restrictions.eq("estado",0));
		  }else{
			  crit.add(Restrictions.eq("estado",habitacion.getEstado()));
		  }
		  if(habitacion.getPiso()!=null){
			  crit.add(Restrictions.eq("piso",habitacion.getPiso()));
		  }
		  if(habitacion.getCategoria()!=null){
              Criteria crit2 = crit.createCriteria("categoria");
              if(habitacion.getCategoria().getIdcategoria() !=null && habitacion.getCategoria().getIdcategoria() > 0){
            	  crit2.add(Restrictions.eq("idcategoria",habitacion.getCategoria().getIdcategoria()));
    		  }
		  }
		 
		  if(habitacion.getTipohabitacion()!=null){
              Criteria crit2 = crit.createCriteria("tipohabitacion");
              if(habitacion.getTipohabitacion().getIdtipoHabitacion() !=null && habitacion.getTipohabitacion().getIdtipoHabitacion() > 0){
            	  crit2.add(Restrictions.eq("idtipoHabitacion",habitacion.getTipohabitacion().getIdtipoHabitacion()));
              }
		  }
		return crit.list();
	}

    @Override
   public List<Habitacion> listaHabitacionessinEstado(Habitacion habitacion) {
       Criteria crit = getSession().createCriteria(Habitacion.class);
       if(habitacion.getPiso()!=null){
                  crit.add(Restrictions.eq("piso",habitacion.getPiso()));
       }
       if(habitacion.getCategoria()!=null){
          Criteria crit2 = crit.createCriteria("categoria");
          if(habitacion.getCategoria().getIdcategoria() !=null && habitacion.getCategoria().getIdcategoria() > 0){
            crit2.add(Restrictions.eq("idcategoria",habitacion.getCategoria().getIdcategoria()));
          }
       }

       if(habitacion.getTipohabitacion()!=null){
           Criteria crit2 = crit.createCriteria("tipohabitacion");
           if(habitacion.getTipohabitacion().getIdtipoHabitacion() !=null && habitacion.getTipohabitacion().getIdtipoHabitacion() > 0){
              crit2.add(Restrictions.eq("idtipoHabitacion",habitacion.getTipohabitacion().getIdtipoHabitacion()));
           }
       }
       return crit.list();
   }


	@Override
	@Transactional(propagation=Propagation.MANDATORY)
	public void modificarHabitacion(Habitacion habitacion) {
		this.getHibernateTemplate().merge(habitacion);
	}
	@Override
	@Transactional(propagation=Propagation.REQUIRES_NEW)
	public void eliminarHabitacion(Habitacion habitacion) {
		this.getHibernateTemplate().merge(habitacion);
	}
	@Override
	@Transactional(propagation=Propagation.REQUIRES_NEW)
	public void registrarHabitacion(Habitacion habitacion) {
		if(habitacion.getIdhabitacion()==null){
			this.getHibernateTemplate().persist(habitacion);	
		}else{
			this.getHibernateTemplate().merge(habitacion);
		}
	}

	@Override
	public Habitacion obtenerHabitacion(Integer idhabitacion) {
		
		Query query = getSession().createQuery(" from Habitacion h where idhabitacion= :id ")
                .setInteger("id", idhabitacion);
                return (Habitacion) query.uniqueResult();

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Tipohabitacion> listaTipoHabitacion() {
		return this.getHibernateTemplate().find("from Tipohabitacion h ");
	}

	@Override
	public Tipohabitacion obtenerTipoHabitacion(Integer idtipoHabitacion) {
		Query query = getSession().createQuery(" from Tipohabitacion t where idtipoHabitacion= :id")
                .setInteger("id", idtipoHabitacion);
                return (Tipohabitacion) query.uniqueResult();
	}

	@Override
	public void registrarTipoHabitacion(Tipohabitacion th) {
		this.getHibernateTemplate().saveOrUpdate(th);
	}


}
